package com.cet.algorithm.二叉树.删除二叉搜索树中的节点;

/**
 * @program: cet-practice
 * @description: 删除BST节点（难）
 * @author: 陈恩涛
 * @create: 2023-04-06 20:04
 **/
public class LC450 {
    public static void main(String[] args) {

    }

    /**
     * 最复杂情况，被删除节点左右子树绝不为空，
     * 将被删除节点的左子树移动到被删除节点右子树的最左边节点的左链接上，
     * 被删除节点的右子树移动到被删除节点上
     * @param root
     * @param key
     * @return
     */

    public TreeNode deleteNode(TreeNode root, int key) {
        if (root == null) {
            return root;
        }
        if (root.val == key) {
            if (root.left == null) {
                return root.right;
            } else if (root.right == null) {
                return root.left;
            } else {
                TreeNode cur = root.right;
                while (cur.left != null) {
                    cur = cur.left;
                }
                cur.left = root.left;
                root = root.right;
                return root;
            }
        }
        if (root.val > key) {
            root.left = deleteNode(root.left, key);
        }
        if (root.val < key) {
            root.right = deleteNode(root.right, key);
        }
        return root;
    }
}
